package tests;


import static org.junit.Assert.assertTrue;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import ordenamiento.OrdenamientoPorTiempoDeVuelo;

import org.junit.Before;
import org.junit.Test;

import vuelo.Vuelo;
import vuelo.VueloConEscala;
import vuelo.VueloDirecto;
import asiento.Asiento;
import busqueda.Busqueda;

public class OrdenamientoPorTiempoDeVueloTest {
        
        OrdenamientoPorTiempoDeVuelo orden = new OrdenamientoPorTiempoDeVuelo();
        Collection<Vuelo> colVuelosDirectos = new ArrayList<Vuelo>();
        ArrayList<Vuelo> colVuelosConEscala = new ArrayList<Vuelo>();
        ArrayList<Vuelo> colVuelosMezclados = new ArrayList<Vuelo>();
        ArrayList<VueloDirecto> colVuelosDirectos2 = new ArrayList<VueloDirecto>();
        ArrayList<VueloDirecto> colVuelosDirectos3 = new ArrayList<VueloDirecto>();
        ArrayList<VueloDirecto> colVuelosDirectos4 = new ArrayList<VueloDirecto>();
        Busqueda busqueda;
        VueloDirecto vueloDirecto1;
        VueloDirecto vueloDirecto2;
        VueloDirecto vueloDirecto3;
        VueloConEscala vueloConEscala1,vueloConEscala2,vueloConEscala3;
        VueloDirecto vueloOrdenado;
        VueloConEscala vueloOrdenadoConEscala;
        Asiento asiento1,asiento2;
        BigDecimal test;
        Collection<Vuelo> resultado;

        @Before
        public void setUp() throws Exception {
                
                Asiento asiento1=new Asiento();
                asiento1.setFechaLlegada(new Date());
                asiento1.setFechaSalida(new Date());
                VueloDirecto vueloDirecto1=new VueloDirecto("vuelo1",asiento1);
                vueloDirecto1.setTiempoDeVuelo(new BigDecimal(2));
                vueloDirecto1.setFechaSalida(new Date());
                vueloDirecto1.setFechaLLegada(new Date());
                colVuelosDirectos.add(vueloDirecto1);
                
                VueloDirecto vueloDirecto2=new VueloDirecto("vuelo2",asiento1);
                vueloDirecto2.setTiempoDeVuelo(new BigDecimal(1));
                vueloDirecto2.setFechaSalida(new Date());
                vueloDirecto2.setFechaLLegada(new Date());
                colVuelosDirectos.add(vueloDirecto2);
                
                VueloDirecto vueloDirecto3=new VueloDirecto("vuelo3",asiento1);
                vueloDirecto3.setTiempoDeVuelo(new BigDecimal(5));
                vueloDirecto3.setFechaSalida(new Date());
                vueloDirecto3.setFechaLLegada(new Date());
                colVuelosDirectos.add(vueloDirecto3);
                
                //El primer vuelo con escala tiene
                // vuelo1=2hs
                // vuelo2=1hs
                // tiempoConexion = 7hs, total 10hs el vuelo
                colVuelosDirectos2.add(vueloDirecto1);
                colVuelosDirectos2.add(vueloDirecto2);
                VueloConEscala vueloConEscala1=new VueloConEscala(colVuelosDirectos2);
                vueloConEscala1.setTiempoDeConexion(new BigDecimal(7));
                colVuelosConEscala.add(vueloConEscala1);
                
                //El primer vuelo con escala tiene
                // vuelo1=2hs
                // vuelo3=5hs
                // tiempoConexion = 1hs, total 8hs el vuelo
                colVuelosDirectos3.add(vueloDirecto1);
                colVuelosDirectos3.add(vueloDirecto3);
                VueloConEscala vueloConEscala2=new VueloConEscala(colVuelosDirectos3);
                vueloConEscala1.setTiempoDeConexion(new BigDecimal(4));
                colVuelosConEscala.add(vueloConEscala2);
                
                colVuelosMezclados.add(vueloDirecto1);
                colVuelosMezclados.add(vueloConEscala1);
                colVuelosMezclados.add(vueloDirecto2);
                
        }
        
        @Test
        public void ordenamientoPorTiempoEntreVuelosDirectos() {
                vueloOrdenado=(VueloDirecto) ((ArrayList<Vuelo>) orden.ordenar(colVuelosDirectos)).get(0);
                assertTrue(vueloOrdenado.getCodigoDeVuelo().equals("vuelo2"));
        }
        
        @Test
        public void ordenamientoPorTiempoEntreVuelosConEscalas() {
        		VueloConEscala vueloOrdenado = (VueloConEscala) ((ArrayList<Vuelo>)orden.ordenar(colVuelosConEscala)).get(0);
        		BigDecimal ble = vueloOrdenado.dameTiempoDeVuelo();
        		assertTrue(vueloOrdenado.dameTiempoDeVuelo().equals(new BigDecimal(9)));
        }
        
        @Test
        public void ordenamientoPorTiempoEntreVuelosConEscalasYVuelosDirectos() {
                resultado=orden.ordenar(colVuelosMezclados);
                Iterator <Vuelo> iterador=resultado.iterator();
                assertTrue(iterador.next().dameTiempoDeVuelo().equals(new BigDecimal(1)));
        }

}